var bu_fila; //Variable que sirve para coger los filtros del tipo de usuario que se estan usando

// Array que sirve para mostrar los filtros que hay dependiendo del tipo de usuario
var bu_plantilla = new Array(); 
	bu_plantilla['all'] = new Array('dni','nombre','apellido1','apellido2','tipousuario');
	bu_plantilla['pro'] = new Array('dni','nombre','apellido1','apellido2','tipoprofesor');
	bu_plantilla['alu'] = new Array('dni','nombre','apellido1','apellido2','esp');
	bu_plantilla['adm'] = new Array('dni','nombre','apellido1','apellido2');
	bu_plantilla['ent'] = new Array('dni','nombre','apellido1','apellido2');

//Array que sirve para mostrar el titulo de campo correcto (texto que aparecera en la cabecera/nombre de los filtros)
var bu_campos_cabecera = new Array();
	bu_campos_cabecera['dni'] = "DNI";
	bu_campos_cabecera['nombre'] = "Nombre";
	bu_campos_cabecera['apellido1'] = "1&ordm; Apellido";
	bu_campos_cabecera['apellido2'] = "2&ordm; Apellido";
	bu_campos_cabecera['tipousuario'] = "Tipo";
	bu_campos_cabecera['tipoprofesor'] = "Docente";
	bu_campos_cabecera['esp'] = "Especialidad";

function buscarUsuario(tipo,num_seleccionado,f_aceptar){
	/*
		Descripción: Encargada de dar forma a la ventana Buscar Usuarios dibujando y dandoles funcionalidad a los diferentes elementos.
		Ejemplo: -buscarUsuario("all",0,f_aceptar);
				-buscarUsuario("pro",1,f_aceptar);
		Entrada: tipo: tipo de usuario ["all"|"alu"|"pro"|"adm"|"ent"]
				num_seleccionado: cantidad de usuarios a seleccionar: 0 (mas de uno), 1 (solo 1)
				f_aceptar: funci�n que recibir� los usuarios seleccionados (los ids)
		Salida: Ninguna
	*/

	var id_usuarios; //Variable donde se almacenara los IDs de los usuarios seleccionados
	
	//DIBUJAR LA VENTANA
	//Codigo html para añadir filtros
	var filtros = ['<li id=dni><a>DNI</a></li>','<li id=nombre><a>Nombre</a></li>','<li id=apellido1><a>1&ordm; Apellido</a></li>','<li id=apellido2><a>2&ordm; Apellido</a></li>','<li id=tipoprofesor><a>Docente</a></li>','<li id=esp><a>Especialidad</a></li>'];

	//Codigo html para el div(boton,menu) de los filtros
	var filtro='<div id="div_filtro" class="derecha"><div>Buscar por: <button id="select" class="boton_filtro">Selecciona un filtro</button></div></div>';
	
	//Codigo html para advertir de que esta activa la selecci�n multiple
	var texto_aviso = '';
	if(num_seleccionado == 0)
		texto_aviso = '<div id="texto_aviso">*Puede seleccionar varios profesores con el rat\u00f3n o dejando pulsado la tecla Ctrl.</div>';
		
	//Codigo html de la ventana buscar Usuario
	var ventana_buscar= $('<div><p>Buscar Usuario</p><hr><div id="parametros">Usuario<select id="tipo_user"><option value="all">Todos</option><option value="pro">Profesor</option><option value="alu">Alumno</option><option value="ent">Entidad</option><option value="adm">Administrativo</option></select>'+filtro+'</div><div id="input_filtros"></div><div id="buscador" class="buscador"></div>'+texto_aviso+'</div>');
	
	//Dibujar la ventana si existe el tipo de ususario
	if(tipo=="alu" || tipo=="pro" || tipo=="ent" || tipo=="adm" || tipo=="all"){
		//Dibujar Ventana BuscarUsuario
		ventana_buscar.dialog({
			autoOpen: true,
			open: function(event, ui) {
				 $(".ui-dialog-titlebar").hide();
			},
			modal: true, 
			resizable: false,
			minWidth: 800,
			minHeight: 500,
			buttons: [{ 
				id: "button-aceptar",
				text: "A\u00f1adir",
				disabled: true,
				click: function() { 
					var contador = 0;
					id_usuarios = [];
					$("#cuerpo_contenido").find("tr").each(function(index, row) {//Recorrer los usuarios de la tabla
						if($(row).hasClass("my-selected")){//y los que esten seleccionados
							id_usuarios[contador]=$(row).attr("id");//almacenar su id en id_usuarios
							contador++;
						}
					});
					if(eval(f_aceptar+"id_usuarios)")) //llamar a la funcion "f_aceptar" y pasarle los ids de los usuarios
						$(this).dialog("destroy"); 
				}
			},{
				text: "Cancelar",
				click: function() { 
					$(this).dialog("destroy"); 
				}
			}]	
		});
		
		//DAR FUNCIONALIDAD A LA VENTANA
		//Cambiar select segun tipo (Poder buscar por diferentes tipos de usuarios)
		$("#tipo_user").val(tipo);
		if(tipo!="all")
			$("#tipo_user").attr('disabled','disabled');
		
		//Dibujar Elementos del Filtro (Pestaña de busqueda)
	    dibujarBotonMenu();
	    
		//Dibujar el buscador (tabla donde estan los usuarios)
		buscador(num_seleccionado,filtros);
			
		//Cambiar filtros de busqueda segun tipo de usuario
		$("#tipo_user").change(function(){
			buscador(num_seleccionado,filtros);//Dibujar el buscador
			habilitarAceptar();//Comprobar boton aceptar
		});
	}else
		alert("El tipo de usuario a buscar no existe");
}

function buscador(num_seleccionado,filtros){
	//Estructura para buscar (usuarios por filtros)
	bu_fila = new Array();
	for(i=0;i<bu_plantilla[$("#tipo_user").val()].length;i++)
		bu_fila[bu_plantilla[$("#tipo_user").val()][i]] = '';

	//Dibujar Elementos del Filtro
	actualizarMenuFiltro(filtros);
	//Dibujar Menu Filtro
	dibujarMenuFiltro();
	//Dibujar Elementos Buscador (subventana donde se muestras los usuarios)
	dibujarBuscador(num_seleccionado);
}

//FUNCIONES DE DIBUJADO DEL BUSCADOR-------------------------------------------------------------
function actualizarMenuFiltro(filtros){
	/*
		Descripción: Encargada de actualizar el filtro segun el usuario seleccionado
		Ejemplo: -actualizarMenuFiltro(filtros);
		Entrada: -filtros: Codigo html de todos los filtros de usuario
		Salida: Ninguna
	*/
	
	//Ver si existe la lista y borrarla
	if ($("#lista_filtro").length)
		$("#lista_filtro").remove();

	//Borrar Filtros anteriores
	$("#input_filtros").empty();
	
	//Se vuelve a crear
	$("#div_filtro").append("<ul id='lista_filtro'></ul>");
	//Numero de filtros del usuario
	for(var i=0;i<bu_plantilla[$("#tipo_user").val()].length;i++)
		for(var j=0;j<filtros.length;j++)
			//Se a�ade filtro si pertenece al usuario
			if(bu_plantilla[$("#tipo_user").val()][i]==filtros[j].substr(7,filtros[j].indexOf('>')-7)){
				//A�adimos filtro al menu de filtros
				$("#lista_filtro").append(filtros[j]);
				//Al hacer click en el filtro
				$("#"+bu_plantilla[$("#tipo_user").val()][i]).click(function() {	
					dibujarFiltro(this.id);	
				});
			}	
}

function dibujarBotonFiltro(id_boton){
	/*
		Descripción: Encargada dibuja el boton cerrar del filtro y darle funcionalidad al hacer click en él.
		Ejemplo: -dibujarBotonFiltro(id);
		Entrada: -id_boton: Codigo id del filtro para poder identificarlo
		Salida: Ninguna
	*/
	//Dibujar boton cerrar del filtro
	$("#"+id_boton).button({
		text: false,
	    icons: {
	    	primary: "ui-icon-closethick"
	    }
	});
	//Al hacer click en el boton
	$("#"+id_boton).click(function() {
		bu_fila[id_boton.split('_')[1]]='';
		//Actualizar usuarios buscados
		comparador();
		//Borrar filtro
		$("#div_filtro_"+id_boton.split('_')[1]).remove();
		//Mostrar opcion en el menu
		$("#"+id_boton.split('_')[1]).show();
	});
}

function dibujarBotonMenu(){
	/*
		Descripción: Encargada dibuja el boton filtros
		Ejemplo: -dibujarBotonMenu();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	//Dibujar boton que muestra la lista de filtros a elegir	
    $("#select").button({
		text: false,
	    icons: {
	    	primary: "ui-icon-triangle-1-s"
	    }
    });
}

function dibujarBuscador(num_seleccionado){
	/*
		Descripción: Encargada llamar a las funciones que crean el recuadro de los usuarios a buscar.
		Ejemplo: -dibujarBuscador(num_seleccionado);
		Entrada: num_seleccionado: cantidad de usuarios a seleccionar: 0 (mas de uno), 1 (solo 1).
		Salida: Ninguna.
	*/
	//Dibujar tabla del buscador
	dibujarTablaBuscador();
	//Dibujar cabereza de la tabla segun el usuario
	dibujarCabecera();
	//A�adir Usuarios a la tabla
	cargarDatos(['lista_usuario&tipo='+$("#tipo_user").val()+'&columna=ninguno&ordenar='],['cuerpo_contenido']);
	//Solo entra si existen datos en la base de datos
	if($("#cuerpo_contenido tr td").length != 1){
		//Funcion seleccionable de los usuarios
		seleccionUsuarios(num_seleccionado);
	}
}

function dibujarCabecera(){
	/*
		Descripción: Encargada dibujar la cabezera de la tabla y de darle funcionalidad (Ordenar descendientemente y ascendentemente)
		Ejemplo: -dibujarCabecera();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	//A�adir segun tipo de usuario los tipos de cabezeras
	var cabecera = "<tr class='ui-widget-header'>";
	for(i=0;i<bu_plantilla[$("#tipo_user").val()].length;i++)
		cabecera += "<th id='header_"+bu_plantilla[$("#tipo_user").val()][i]+"'>"+bu_campos_cabecera[bu_plantilla[$("#tipo_user").val()][i]]+"</th>";
	cabecera += "</tr>";
	
	//Añadir la cabezera ya construida
	$("#cuerpo_cabecera").append(cabecera);
	
	//A�adir funcionalidad (ordenar por columna)
	for(i=0;i<bu_plantilla[$("#tipo_user").val()].length;i++)
		$("#header_"+bu_plantilla[$("#tipo_user").val()][i]).click(function() { //Dibujar simbolo de busqueda
			if($(this).children("span").length == 0 || $(this).children("span").hasClass("ui-icon ui-icon-carat-1-s"))
				ordenarPor($(this),"ASC","ui-icon-carat-1-n");//Busqueda ascendente
			else
				ordenarPor($(this),"DESC","ui-icon-carat-1-s");//Busqueda descendente

			//Actualizamos usuarios
			comparador();
		});
	//hacer la cabecera no seleccionable
	$("#cuerpo_cabecera").disableSelection();
}

function dibujarFiltro(id){
	/*
		Descripción: Encargado de dibujar el impunt del filtro elegido desde el meno de filtros
		Ejemplo: -dibujarFiltro(id);
		Entrada: id: Numero de id asignado al filtro.
		Salida: Ninguna.
	*/
	//Dibujar filtros elegido en el menu
	$("#input_filtros").append("<div id='div_filtro_"+id+"'><input type='text' id='filtro_text_"+id+"' placeholder='"+bu_campos_cabecera[id]+"' autofocus='true'><button id='boton_"+id+"' class='boton_filtro'>Quitar Filtro</button></div>");
	//Dibujar el boton del filtro para cerralo
	dibujarBotonFiltro("boton_"+id+"");
	//A�adirle funcion 
	$("#filtro_text_"+id+"").keyup(buscarPorColumna);
	//Ocultar seleccion del menu
	$("#"+id).hide();
	//Pasar foco al filtro (no va)
	$("#filtro_text_"+id).focus();
}

function dibujarMenuFiltro(){
	/*
		Descripción: Encargado de mostrar el menu despegable de los filtros al pulsar la pestaña
		Ejemplo: dibujarMenuFiltro();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	//Al hacer clicl en boton select mostrar menu de filtros a elegir
	$("#select").click(function() {
		var menu = $("#lista_filtro").show().position({
			my: "right top",
			at: "right bottom",
			of: this
		});
		$("#lista_filtro").one("mouseleave", function() {
			menu.hide();
		});
	});
	$("#lista_filtro").hide().menu();
}

function dibujarTablaBuscador(){
	/*
		Descripción: Encargado de dibujar el cuerpo de la tabla usuarios.
		Ejemplo: dibujarTablaBuscador();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	if(!($('#tabla_buscador').length)){ //Ejecutar si no existe el elemento
	 	var tabla = "<table id='tabla_buscador' class='ui-widget ui-widget-content'></table>";
		$("#buscador").append(tabla);
		var cuerpo_cabecera = "<thead id='cuerpo_cabecera'></thead>";
		$("#tabla_buscador").append(cuerpo_cabecera);
		var cuerpo_contenido ="<tbody id='cuerpo_contenido'></tbody>";
		$("#tabla_buscador").append(cuerpo_contenido);
	}else{  //Ejecutar si existe el elemento
		$('#cuerpo_cabecera').empty();
		$('#cuerpo_contenido').empty();
	}
}

//FUNCIONES DE BUSCADOR
function buscarPorColumna(){
	/*
		Descripción: Encargado de deseleccionar filas en caso de estar seleccionadas y llamar a otras funciones para realizar la busqueda que se realiza
					con el filtro.
		Ejemplo: buscarPorColumna();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	if(!(event.keyCode == 17)){ // Si no se pulsa ctrl (Boton para seleccinar una fila)
	   	//Si hay alguna fila seleccionada la deselecionamos porque se esta buscando resultados
	   	$("#cuerpo_contenido").find("tr").each(function(index, row) {	
			if($(row).hasClass("my-selected")){
				$(row).removeClass("my-selected");
				$(row).removeClass("ui-selected");
			}
		});
		//Se mira el boton aceptar (Habilitar/desabilitar)  para cambiar su estado
		habilitarAceptar();
	}
	//Actualizamos la plantilla del filtro y comparamos
	bu_fila[this.id.split('_')[2]]=this.value;
	comparador();
}

function comparador(){
	/*
		Descripción: Encargado de comparar lo escrito en el filtro con cada celda de cada fila y mostrar las filas que coincidan con la busqueda.
		Ejemplo: comparador();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	//Por cada fila (usuario)
	$("#tabla_buscador tbody").find("tr").each(function(index, row) {	
		var allCells = $(row).find('td');
		var found = true;
		//Por cada celda de la fila
		allCells.each(function(index, td) {
			//Nuevo comparador de la variable fila segun lel campo
			var regExp = new RegExp(bu_fila[bu_plantilla[$("#tipo_user").val()][index]], 'i');
			//Comparamos comparador con lo escrito
			if(!(regExp.test($(td).text()))){ // si no similitud
				found = false; //bandera a false
				return false; //Saltamos a la siguiente fila (usuario)
			}	
		});
		if (found == true) $(row).show();
        else $(row).hide();
	});
}

function habilitarAceptar(){
	/*
		Descripción: Encargado de mirar si hay algun usuario seleccionado y habilitar el boton "Añadir"
		Ejemplo: habilitarAceptar();
		Entrada: Ninguna.
		Salida: Ninguna.
	*/
	//Miras las filas con clase "my-selected"
	var filas_seleccionadas = 0;
	$("#cuerpo_contenido").find("tr").each(function(index, row) {	
		if($(row).hasClass("my-selected"))
			filas_seleccionadas++;
	});
	//Si hay alguna, el boton se habilita sino se deshabilita
	if(filas_seleccionadas==0)
		$("#button-aceptar").button("option", "disabled", true);
	else
		$("#button-aceptar").button("option", "disabled", false);
}

function ordenarPor(objeto,orden,icono){
	/*
		Descripción: Encargado de ordenar los usuarios ascendente o descendentemente segun lo indicado
		Ejemplo: -ordenarPor($(this),"ASC","ui-icon-carat-1-n");
				-ordenarPor($(this),"DESC","ui-icon-carat-1-s");
		Entrada: -objeto: cabezera de la tabla correspondiente
				-orden: indica que tipo de orden se quiere (ascendente o descendente)
				-icono: El icono que simboliza cada tipo de orden
		Salida: Ninguna.
	*/
	//Borramos todas las flechas anteriores (flecha que marcha que una columna es usada para ordenar a los usuarios)
	$(".ui-icon-carat-1-n").remove();$(".ui-icon-carat-1-s").remove();
	//A�adimos nueva flecha
	objeto.append("<span class='ui-icon "+icono+" derecha' ></span>");
	//A�adir Usuarios a la tabla segun nuevo orden de prioridad marcado por la columna y la variable orden
	cargarDatos(['lista_usuario&tipo='+$("#tipo_user").val()+'&columna='+objeto.attr("id").split('_')[1]+'&ordenar='+orden],['cuerpo_contenido']);
}

function seleccionUsuarios(num_seleccionado){
	/*
		Descripción: Encargado de controlar si se puede seleccionar a mas de un usuario a la vez segun la variable "num_seleccionado" 
					y de desseleccionar si es el caso.
		Ejemplo: -seleccionUsuarios(1);
				-seleccionUsuarios(0);
		Entrada: -num_seleccionado: cantidad de usuarios a seleccionar: 0 (mas de uno), 1 (solo 1).
		Salida: Ninguna.
	*/
	//Hace las filas seleccionables
	$("#cuerpo_contenido").selectable({
		filter: "tr",
		selected: function( event, ui ) { //Al seleccionar una fila
			$(ui.selected).addClass("my-selected");
			if(num_seleccionado==1){ //Controlar que no se pueda seleccionar mas de un usuario a la vez
				$(ui.selected).siblings().removeClass("ui-selected");//quitarle el efecto al anterior
				$(ui.selected).siblings().removeClass("my-selected");//quitarle la clase al anterior
			}
			habilitarAceptar();//Comprobar boton aceptar
		},
		unselected: function( event, ui ) { //Al deselecionar una fila
			$(ui.unselected).removeClass("my-selected");
			habilitarAceptar();//Comprobar boton aceptar
		}
	});
}